package com.linghu.qqservice.service;

import com.linghu.qqcommon.Message;
import com.linghu.qqcommon.MessageType;
import com.linghu.qqcommon.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;

/**
 * @author 令狐荣豪
 * @version 1.0
 * 服务端，监听9999，等待客户端来连接，并保持通信
 */
public class QQServer {
    private ServerSocket ss=null;

    //创建一个集合，存放多个用户，如果这些用户登录，就认为是合法的,用集合来代替数据库
    private static HashMap<String ,User> validUsers=new HashMap<>();
    static {//静态代码在创建对象的时候一开始会被初始化，初始化validUsers
        validUsers.put("100",new User("100","123456"));
        validUsers.put("200",new User("200","123456"));
        validUsers.put("300",new User("300","123456"));
        validUsers.put("至尊宝",new User("至尊宝","123456"));
        validUsers.put("紫霞仙子",new User("紫霞仙子","123456"));

    }

    //验证用户是否有效的方法
    public boolean checkUser(String userId,String passwd){
        User user = validUsers.get(userId);
        if (user==null){
            return false;
        }
        if (!user.getPasswd().equals(passwd)){//userId正确，但是密码错误
            return false;
        }
        return true;//其余情况，过关斩将验证方式
    }

    public QQServer() throws IOException {
        System.out.println("服务端在9999端口监听");
        try {
            //启动推送新闻的线程
            new Thread(new SendNewsToAllService()).start();
            ss=new ServerSocket(9999);

            while (true){//一直在监听
                Socket socket = ss.accept();
                //得到socket关联的对象输入流
                ObjectInputStream ois =
                        new ObjectInputStream(socket.getInputStream());
                User u = (User) ois.readObject();//读客户端发送的user对象
                //创建一个messa对象，准备回复客户端
                Message message=new Message();
                //得到对象关联的对象输出流
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

                //验证用户
                if (checkUser(u.getUserId(), u.getPasswd())){
                    message.setMesType(MessageType.MESSAGE_LOGIN_SUCCEED);
                    //将message对象回复客户端
                    oos.writeObject(message);
                    //创建一个线程。和客户端保持通信，该线程需要持有socket对象
                    ServerConnectClientThread serverConnectClientThread =
                            new ServerConnectClientThread(socket, u.getUserId());
                //启动该线程
                    serverConnectClientThread.start();
                    //把该线程对象放入到集合中进行管理
                    ManagerClientThreads.addClientThread(u.getUserId(),serverConnectClientThread);
                }else {//登录失败
                    System.out.println("用户 id="+u.getUserId()+"pw="+u.getPasswd()+"验证失败！");
                    message.setMesType(MessageType.MESSAGE_LOGIN_FAIL);
                    oos.writeObject(message);
                    socket.close();
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            //如果服务器退出了while，说明服务端不在监听，因此关闭ServerSocket
            ss.close();
        }
    }
}
